package com.zkh.myutils.io.excel.data;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Calendar;
import java.util.Date;

import com.zkh.myutils.utils.DateUtils;

/**
 * 单元格数据
 * @author zkh
 */
public class CellData {
	//公式
	private String formula;
	//字符串值
	private String stringValue;
	//数字值
	private BigDecimal numberValue;
	//引用字符串索引
	private int index = -1;
	//空单元格对象
	public final static CellData EMPTY_CELLDATA = new CellData.EmptyCellData();
	
	/**
	 * 克隆单元格
	 * @param cellData 被克隆的单元格
	 * @return 如果为空单元格对象，则直接返回，否则返回克隆的新单元格对象
	 */
	public static CellData clone(CellData cellData) {
		//空
		if(cellData instanceof EmptyCellData) {
			return cellData;
		}
		//创建新对象
		CellData newCellData = new CellData();
		//赋值
		newCellData.setFormula(cellData.getFormula());
		newCellData.setIndex(cellData.getIndex());
		newCellData.setNumberValue(cellData.getNumberValue());
		newCellData.setStringValue(cellData.getStringValue());
		newCellData.setIndex(cellData.getIndex());
		//返回新对象
		return newCellData;
	}
	
	public CellData() {
	}
	public CellData(String stringValue) {
		this.stringValue = stringValue;
	}
	public CellData(BigDecimal numberValue) {
		this.numberValue = numberValue;
	}
	public CellData(String formula, String stringValue) {
		this.formula = formula;
		this.stringValue = stringValue;
	}
	public CellData(String formula, BigDecimal numberValue) {
		this.formula = formula;
		this.numberValue = numberValue;
	}
	
	/**
	 * 单元格是否为空
	 */
	public boolean isEmpty() {
		return stringValue==null && numberValue==null && formula==null && index==-1;
	}

	/**
	 * 获取Boolean值
	 */
	public boolean getBooleanValue() {
		//字符串值
		if(stringValue!=null) return "true".equals(stringValue);
		//数字值
		if(numberValue!=null) return numberValue.compareTo(BigDecimal.ZERO)!=0;
		//均没有值
		return false;
	}
	
	/**
	 * 获取Long型值
	 */
	public Long getLongValue() {
		//数字值
		if(numberValue!=null) return numberValue.longValue();
		//字符串值
		if(stringValue!=null) return new Long(stringValue);
		//没有值
		return null;
	}
	
	/**
	 * 获取Double型值
	 */
	public Double getDoubleValue() {
		//数字值
		if(numberValue!=null) return numberValue.doubleValue();
		//字符串值
		if(stringValue!=null) return new Double(stringValue);
		//没有值
		return null;
	}
	
	/**
	 * 获取日期值
	 */
	public Date getDateValue() {
		return getDateValue("yyyy-MM-dd HH:mm:ss");
	}
	
	/**
	 * 获取日期值。针对单元格存储的日期字符串，需要转换为日期的场景
	 * @param pattern 日期格式。
	 */
	public Date getDateValue(String pattern) {
		//字符串值
		if(stringValue!=null) return DateUtils.getDate(stringValue, pattern);
		//数字值
		if(numberValue!=null) {
			//整数部分
			BigDecimal intPart = numberValue.setScale(0, RoundingMode.DOWN);
			//小数部分并转换为秒
			int fraPart = numberValue.subtract(intPart).multiply(BigDecimal.valueOf(24 * 60 * 60)).setScale(0, RoundingMode.HALF_DOWN).intValue();
			//日历对象
			Calendar calendar = Calendar.getInstance();
			//整数部分，转换日期
			if(intPart.compareTo(BigDecimal.ZERO)>0) {
				//基线日期
				calendar.set(1900, 0, 1);
				//累加
				calendar.add(Calendar.DATE, intPart.intValue()-2);
			}
			//小数部分
			if(fraPart>0) {
				//设置秒
				calendar.set(Calendar.SECOND, fraPart%60);
				//设置分
				calendar.set(Calendar.MINUTE, (fraPart/=60)%60);
				//设置小时
				calendar.set(Calendar.HOUR_OF_DAY, (fraPart/=60)%24);
			}
			//返回
			return calendar.getTime();
		}
		//其它值
		return null;
	}
	
	/**
	 * 获取公式
	 */
	public String getFormula() {
		return formula;
	}
	
	/**
	 * 获取字符串值
	 */
	public String getStringValue() {
		return stringValue!=null ? stringValue : (numberValue!=null ? numberValue.toString() : null);
	}
	
	public void setFormula(String formula) {
		this.formula = formula;
	}
	public void setStringValue(String stringValue) {
		this.stringValue = stringValue;
	}
	public BigDecimal getNumberValue() {
		return numberValue;
	}
	public void setNumberValue(BigDecimal numberValue) {
		this.numberValue = numberValue;
	}
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	@Override
	public String toString() {
		return getStringValue();
	}
	
	/**
	 * 空单元格对象
	 */
	static class EmptyCellData extends CellData{
		public void setFormula(String formula) {
			throw new UnsupportedOperationException("空单元格对象不支持修改值");
		}
		public void setStringValue(String stringValue) {
			throw new UnsupportedOperationException("空单元格对象不支持修改值");
		}
		public void setNumberValue(BigDecimal numberValue) {
			throw new UnsupportedOperationException("空单元格对象不支持修改值");
		}
		public void setIndex(int index) {
			throw new UnsupportedOperationException("空单元格对象不支持修改值");
		}
	}
}
